Hide code cell source
%config InlineBackend.rc = {"figure.dpi": 72, 'figure.figsize': (6.0, 4.0)}
%matplotlib inline

import ase
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import HTML

import abtem

abtem.config.set({"local_diagnostics.progress_bar": True});

Animations#

Hide code cell source
astigmatism = np.linspace(-70, 70, 50)

astigmatism = np.concatenate([astigmatism, astigmatism[:-1][::-1]])

probe = abtem.Probe(
    semiangle_cutoff=30,
    defocus=60,
    astigmatism=astigmatism,
    astigmatism_angle=np.pi / 4,
    gpts=256,
    extent=10,
    energy=200e3,
)
probes = probe.build().complex_images().compute()
[########################################] | 100% Completed | 215.40 ms
astigmatism
array([-70.        , -67.14285714, -64.28571429, -61.42857143,
       -58.57142857, -55.71428571, -52.85714286, -50.        ,
       -47.14285714, -44.28571429, -41.42857143, -38.57142857,
       -35.71428571, -32.85714286, -30.        , -27.14285714,
       -24.28571429, -21.42857143, -18.57142857, -15.71428571,
       -12.85714286, -10.        ,  -7.14285714,  -4.28571429,
        -1.42857143,   1.42857143,   4.28571429,   7.14285714,
        10.        ,  12.85714286,  15.71428571,  18.57142857,
        21.42857143,  24.28571429,  27.14285714,  30.        ,
        32.85714286,  35.71428571,  38.57142857,  41.42857143,
        44.28571429,  47.14285714,  50.        ,  52.85714286,
        55.71428571,  58.57142857,  61.42857143,  64.28571429,
        67.14285714,  70.        ,  67.14285714,  64.28571429,
        61.42857143,  58.57142857,  55.71428571,  52.85714286,
        50.        ,  47.14285714,  44.28571429,  41.42857143,
        38.57142857,  35.71428571,  32.85714286,  30.        ,
        27.14285714,  24.28571429,  21.42857143,  18.57142857,
        15.71428571,  12.85714286,  10.        ,   7.14285714,
         4.28571429,   1.42857143,  -1.42857143,  -4.28571429,
        -7.14285714, -10.        , -12.85714286, -15.71428571,
       -18.57142857, -21.42857143, -24.28571429, -27.14285714,
       -30.        , -32.85714286, -35.71428571, -38.57142857,
       -41.42857143, -44.28571429, -47.14285714, -50.        ,
       -52.85714286, -55.71428571, -58.57142857, -61.42857143,
       -64.28571429, -67.14285714, -70.        ])

XXX

visualization = probes.show(cmap="hsluv", display=False, cbar=True, vmin=0, vmax=8e-5)

visualization.adjust_figure_aspect()

visualization.set_panel_labels(
    labels="metadata", frameon=False, prop={"color": "w", "fontsize": 12}
)

animation = visualization.animate(adjust_scale=False, interval=100)

HTML(animation.to_jshtml())
#fig, ax = plt.subplots()

visualization = probes.show(cmap="hsluv", display=False, vmin=0, vmax=8e-5)

fig = visualization.fig
ax = visualization.axes[0,0]

fig.set_size_inches(5,5)
ax.set_axis_off() # You don't actually need this line as the saved figure will not include the labels, ticks, etc, but I like to include it
fig.subplots_adjust(left=0, bottom=0, right=1, top=1)

#visualization.adjust_figure_aspect()

#visualization.fig

#visualization.set_panel_labels(
    #labels="metadata", frameon=False, prop={"color": "w", "fontsize": 12}
#)

#visualization.fig.save


#HTML(animation.to_jshtml())
visualization.axis_off(spines=False)

x_extent = visualization.measurements._plot_extent_x(visualization._x_units)
y_extent = visualization.measurements._plot_extent_y(visualization._y_units)

aspect = (y_extent[1] - y_extent[0]) / (x_extent[1] - x_extent[0])

size_x = visualization.fig.get_size_inches()[0]
size_y = size_x * aspect

visualization.fig.set_size_inches((size_x,size_y))
visualization.fig.subplots_adjust(left=0, bottom=0, right=1, top=1)

animation = visualization.animate(adjust_scale=False, interval=100)
animation.save("animations.gif", writer='pillow', savefig_kwargs={"transparent": True})
visualization = measurement[-1].show()
visualization.axis_off()
visualization.fig.savefig("../thumbnails/cbed_quickstart.png", bbox_inches="tight", pad_inches=0, transparent = True)

Ensemble of probe thickness series#

XXX

Hide code cell source
probe = abtem.Probe(
    semiangle_cutoff=30,
    defocus=np.linspace(0, 100, 3),
    gpts=256,
    energy=200e3,
)

atoms_cell = ase.build.bulk("Si", cubic=True)

atoms = atoms_cell * (3, 3, 20)

potential = abtem.Potential(atoms, exit_planes=1)

images = probe.multislice(potential).intensity()

images.compute()
[########################################] | 100% Completed | 895.57 ms
<abtem.measurements.Images object at 0x000002592E3F8250>

XXX

visualization = images.show(
    display=False,
    explode=(1,),
    figsize=(12, 8),
    common_color_scale=True,
)

visualization.set_column_titles("")

visualization.adjust_figure_aspect()

visualization.set_panel_labels(
    labels="metadata", frameon=False, prop={"color": "w", "fontsize": 12}
)

animation = visualization.animate(adjust_scale=True, interval=60)

HTML(animation.to_jshtml())

Diffraction spots#

XXX

from abtem.tilt import precession_tilts

atoms_cell = ase.build.bulk("Si", cubic=True)

atoms = atoms_cell * (1, 1, 50)

potential = abtem.Potential(atoms, sampling=0.05, slice_thickness=2)

wave = abtem.PlaneWave(energy=100e3)

tilts = precession_tilts(10, 100)

wave.tilt = tilts

measurements = wave.multislice(potential).compute()

spots = measurements.diffraction_patterns().index_diffraction_spots(
    cell=atoms_cell.cell, threshold=1e-5
)
[########################################] | 100% Completed | 14.43 ss

XXX

from matplotlib.colors import ListedColormap

cmap = ListedColormap(["w"])

XXX

measurements.axes_metadata[0].label = "precession"
measurements.axes_metadata[0].values = [
    np.arctan2(tilt[1], tilt[0]) / np.pi * 180 + 180 for tilt in tilts
]
measurements.axes_metadata[0].units = "deg."

XXX

visualization = (
    spots.crop(50)
    .block_direct()
    .show(
        explode=False,
        scale=0.4,
        power=0.5,
        common_color_scale=True,
        figsize=(6, 6),
        vmax=0.08,
        display=False,
        cmap="viridis",
    )
)

visualization.adjust_figure_aspect()

visualization.set_panel_labels(
    labels="metadata", frameon=False, prop={"color": "w", "fontsize": 14}
)

for ax in np.array(visualization.axes).ravel():
    ax.set_facecolor("k")

animation = visualization.animate(adjust_scale=False, interval=20)

HTML(animation.to_jshtml())